package com.yykj.drup.server.config;

/**
 * @Author zeng
 * @Date 2022/3/23
 */

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * 因为RedisTemplate默认是使用JDK序列化的方式所以存储的内容都是以二进制编码，
 * 这边重新配置RedisTemplate的序列化方式，使可视化软件显示的数据更直观
 * @author Administrator
 */
@Configuration
public class RedisTemplateConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){

        //创建redisTemplate实例
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String,Object>();
        //配置连接
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置系列化与反序列化的规则（默认是使用JDK的序列化的方式）
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new 			                  											Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        //设置指定要序列化的范围
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        //指定序列化输入的类型，类必须是非final修饰的。
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        //设置序列化的value值的方式
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        //设置序列化的key的值方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置hash结构的key和value序列化方式
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        /**
         *设置是否开启事务默认为false，
         *当设置为true后会导致未标注@Transactional的方法执行后连接不会关闭。
         */
        //redisTemplate.setEnableTransactionSupport(true);
        return redisTemplate;
    }
}
